package com.example.psychologicalappointmentsystem.common;

import com.google.common.base.Preconditions;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.scheduling.support.CronExpression;

import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * 入参检测
 */
public class ParamCheck {
    /**
     * 字符串非空,不可为全空格
     */
    public static void stringIsNotEmpty(String checkStr, String message) {
        Preconditions.checkArgument(StringUtils.isNotBlank(checkStr), message);
    }

    /**
     * 字符串相等检查
     * 两个字符串必须相等，否则报错
     *
     * @param checkStr1
     * @param checkStr2
     * @param message
     */
    public static void stringEqual(String checkStr1, String checkStr2, String message) {
        Preconditions.checkArgument(checkStr1.equals(checkStr2), message);
    }

    /**
     * 不包含特殊字符串
     */
    public static void notIncludeSpecialString(String checkStr, List<String> notStrList, String message) {
        for (String str : notStrList) {
            Preconditions.checkArgument(!checkStr.contains(str), message);
        }
    }

    /**
     * int 必须大于等于1
     */
    public static void intBiggerThenOne(Integer checkInteger, String message) {
        Preconditions.checkArgument(Objects.nonNull(checkInteger) && checkInteger > 0, message);
    }

    /**
     * int 必须大于等于0
     */
    public static void intBiggerThenZero(Integer checkInteger, String message) {
        Preconditions.checkArgument(Objects.nonNull(checkInteger) && checkInteger >= 0, message);
    }
    /**
     * int 必须等于0
     */
    public static void intEqualsZeroCheck(Integer checkInteger, String message) {
        Preconditions.checkArgument(Objects.nonNull(checkInteger) && checkInteger == 0, message);
    }

    /**
     * 列表非空
     */
    public static void listIsNotEmpty(List checkList, String message) {
        Preconditions.checkArgument(CollectionUtils.isNotEmpty(checkList), message);
    }

    /**
     * 列表非空
     */
    public static void listMinSize(List checkList, Integer minSize, String message) {
        listIsNotEmpty(checkList, message);
        Preconditions.checkArgument(checkList.size() >= minSize, message);
    }

    /**
     * 对象非null,否则报错
     */
    public static void mustNonNull(Object checkObj, String message) {
        Preconditions.checkArgument(Objects.nonNull(checkObj), message);
    }

    /**
     * 对象必须为空，否则报错
     */
    public static void mustNull(Object checkObj, String message) {
        Preconditions.checkArgument(Objects.isNull(checkObj), message);
    }

    /**
     * mustTrue 必须为true才能通过检测
     */
    public static void mustTrue(Boolean mustTrue, String message) {
        Preconditions.checkArgument(mustTrue, message);
    }

    /**
     * mustFalse 必须为false才能通过检测
     */
    public static void mustFalse(Boolean mustFalse, String message) {
        Preconditions.checkArgument(!mustFalse, message);
    }


    /**
     * 比较两个时间
     *
     * @param shouldBefore 这个时间应该较早
     * @param shouldAfter  这个时间应该较晚
     * @param message      不符合要求时打印的message
     */
    public static void dateCompare(Date shouldBefore, Date shouldAfter, String message) {
        Preconditions.checkArgument(shouldAfter.after(shouldBefore), message);
    }


    /**
     * 检查字符串长度
     *
     * @param checkStr
     * @param shouldBiggerThenMe  字符串要>=这个值
     * @param shouldSmallerThenMe 字符串长度要<=这个值
     */
    public static void stringLengthCheck(String checkStr, Integer shouldBiggerThenMe, Integer shouldSmallerThenMe, String message) {
        Preconditions.checkArgument(checkStr.length() >= shouldBiggerThenMe, message);
        Preconditions.checkArgument(checkStr.length() <= shouldSmallerThenMe, message);
    }

    /**
     * cron表达式合法检测
     *
     * @param cron
     */
    public static void cronCheck(String cron) {
        CronExpression.parse(cron);
    }
}
